#ifndef __ZHONG_REDIS__
#define __ZHONG_REDIS__

#include "Factory.hpp"
namespace bite_im
{
    class Session
    {
    public:
        using ptr = std::shared_ptr<Session>;
        Session(const RedisPtr &redis_client) : _redis_client(redis_client) {}
        // 添加 会话--用户id映射
        void append(const std::string &session_id, const std::string &user_id)
        {
            _redis_client->set(session_id, user_id);
        }
        void remove(const std::string &session_id)
        {
            _redis_client->del(session_id);
        }
        // 获取用户id，解引用接收对象即可
        sw::redis::OptionalString uid(const std::string &session_id)
        {
            // redis通过get获得的对象ret，判断该对象是否存在 if(ret)
            return _redis_client->get(session_id);
        }

    private:
        RedisPtr _redis_client;
    };

    // 用户登录状态检测
    class Status
    {
    public:
        using ptr = std::shared_ptr<Status>;
        Status(const RedisPtr &redis_client) : _redis_client(redis_client) {}
        void append(const std::string &user_id)
        {
            // 只要能存在redis中即可，不关心value
            _redis_client->set(user_id, " ");
        }
        void remove(const std::string &user_id)
        {
            _redis_client->del(user_id);
        }
        bool exists(const std::string &user_id)
        {
            auto ret = _redis_client->get(user_id);
            return ret ? true : false;
        }

    private:
        RedisPtr _redis_client;
    };

    // 状态码模块
    class Codes
    {
    public:
        using ptr = std::shared_ptr<Codes>;
        Codes(const RedisPtr &redis_client) : _redis_client(redis_client) {}
        void append(const std::string &code_id, const std::string &code_num, int alive_seconds = 300)
        {
            _redis_client->set(code_id, code_num, std::chrono::seconds(alive_seconds));
        }
        void remove(const std::string &code_id)
        {
            _redis_client->del(code_id);
        }
        sw::redis::OptionalString code(const std::string &code_id)
        {
            return _redis_client->get(code_id);
        }

    private:
        RedisPtr _redis_client;
    };
}

#endif